缓冲分析 Sample详情
最后更新时间:2020年12月11日
邻近度(Proximity)描述了地理空间中两个地物距离相近的程度,其确定是空间分析的一个重要手段。如公共设施(商场,邮局,银行,医院,车站,学校等)的服务半径,大型水库建设引起的搬迁,铁路,公路以及航运河道对其所穿过区域经济发展的重要性等,均是一个邻近度问题。缓冲区分析是解决邻近度问题的空间分析工具之一 。
所谓缓冲区就是在点、线、区实体周围建立一定宽度范围的多边形。换言之,任何目标所产生的缓冲区总是一些多边形,这些多边形将构成新的数据层。点的缓冲区,以点的中心坐标为圆心,做半径为缓冲半径的圆;线的缓冲区,根据左右半径的设置形成缓冲区;区的缓冲区,将原始区图元边界向外或向内偏移缓冲半径大小后的区。点、线、区的缓冲分析采用同一套接口,实现方法类似。
在此,以几何要素的缓冲区分析为例。
主要通过API程序包com.zondy.mapgis.geometry下的GeometryOperator类接口实现:
具体实现方法如下:
1
查看缓冲分析的buffer方法,接口参数中分析的对象是Geometry(几何对象基类),所以首先需获取待分析的对象。主要有以下三种方式获取Geometry对象:
FeaturePagedResult result = featureQuery.query(); //要素查询 Feature feature = result.getPage(1).get(i); //获取查询结果要素 Geometry geometry=feature.getGeometry(); //获取要素几何信息
Dot dot = new Dot(12734303.968851445,3570919.2046056115); //坐标点(地图坐标) GraphicPoint graphicPoint = new GraphicPoint(); //创建点图形对象 graphicPoint.setPoint(dot); //点图形对象设置坐标点 graphicPoint.setColor(addColor); //设置点图形填充颜色 graphicPoint.setSize(10); //设置点图形大小 //将点图形转为点几何要素 Geometry geometry = Graphic.toGeometry(graphicPoint);
Dot3D dot = new Dot3D(12734303.968851445,3570919.2046056115,0); //创建坐标点(地图坐标) GeoPoint geoPoint=new GeoPoint (dot); //创建几何对象
2
//执行缓冲分析(参数为:待分析几何要素、缓冲半径、线端类型 ) GeoPolygon geoPolygon = (GeoPolygon)GeometryOperator.buffer(geometry, 2000, CapStyles.ROUND); //将分析结果要素转为几何图形 Listgraphics = Graphic.toGraphicsFromGeometry(geoPolygon); //绘制点缓冲分析结果图形 for (int i = 0; i < graphics.size(); i++) { //设置缓冲分析结果图形填充色 graphics.get(i).setColor(resultColor); //显示缓冲分析结果图形 mapView.getGraphicsOverlay().addGraphic(graphics.get(i)); }
接口说明:GeometryOperator.buffer()的三个参数分别为:待分析几何要素geometry、缓冲半径width、以及线端类型 GeometryOperator.CapStyles(圆角/垂直/平角)。
重要说明: 10.3版本的缓冲区分析接口如下,与10.5版本的接口有所区别:
接口 | 说明 |
---|---|
buffer(Geometry geom, double leftDis, double rightDis, short endCapStyle, SRefData sRefSrc) 参数:几何对象、左半径、右半径、缓冲区边界类型0/1/2-圆角/垂直/平角、数据的源投影坐标系 |
计算左右缓冲区 |
buffer(Geometry geom, double leftDis, double rightDis, SRefData sRefSrc) 参数:几何对象、左半径、右半径、数据的源投影坐标系 |
计算左右缓冲区(圆角边界) |
【1】接口中可以设置左半径、右半径,针对不同类型的几何对象具有不同的作用。 对于点缓冲分析,没有左半径、右半径之说,接口规定分析的半径以左半径参数为准,所以只需要设置左半径即可;对于线缓冲,可以根据线的节点先后顺序确定线要素的方向,从而根据线的方向确定左右半径;对于区缓冲,同样没有左右半径之说,只是对区进行外部缓冲分析,接口规定点缓冲分析的半径以左半径参数为准,所以只需要设置左半径即可。
【2】第一个方法中通过第4个参数可以设置缓冲区边界类型为圆角、垂直、平角三种类型,得到的效果不一样。对于点缓冲区分析,只支持圆角和平角边界,区缓冲只只支持圆角边界;线缓冲三种边界类型都支持。
【3】当geometry几何的空间参考系单位与左右缓冲半径数值的单位一致时,最后一个参数sRefSrc赋值null即可;当geometry的空间参考系单位和左右缓冲半径数值的单位不一致时,必须传入空间参考系对象sRefSrc。如缓冲半径是米,geom几何单位不是米,必须为sRefSrc参数传入geometry几何对象的空间参考系作为源空间参考系,并且缓冲分析得到结果的单位与传递的空间参考系的单位一致。
3
缓冲分析得到的结果为GeoPolygons多区几何对象,根据应用需求,可以将其保存到地理要素中,也可以进行绘制显示,例如:
//将几何对象Geometry转换为几何图形Graphic List<Graphic> graphics = Graphic.toGraphicsFromGeometry(geoPolygons); //一:可以直接按照默认样式快速绘制 mapView.getGraphicsOverlay().addGraphics(graphics); //二:可以为图形设置自定义颜色再进行绘制 for (int i = 0; i < graphics.size(); i++){ //设置缓冲分析结果图形填充颜色 graphics.get(i).setColor(Color.argb(50, 255, 0, 255)); //显示缓冲分析结果图形 mapView.getGraphicsOverlay().addGraphic(graphics.get(i)); } mapView.refresh(); //刷新地图
点缓冲分析的展示效果如下图所示:
线缓冲分析的实现方法与点缓冲分析类似,区别只在于传递的待分析的几何对象类型不一致。
//构建坐标点 Dot dot1 = new Dot(12719530, 3603327); Dot dot2 = new Dot(12736224, 3620660); Dot[] dots = {dot2,dot1}; //创建线图形对象并绘制 GraphicPolylin graphicPolylin = new GraphicPolylin(); graphicPolylin.appendPoints(dots); //设置线图形样式(填充颜色、线宽) graphicPolylin.setColor(addColor); graphicPolylin.setLineWidth(5); //将线图形添加到自定义图层GraphicLayer中 mapView.getGraphicsOverlay().addGraphic(graphicPolylin); //将线图形转为线几何要素以待分析 Geometry geometry = Graphic.toGeometry(graphicPolylin);
分析的效果如下图所示:
与点缓冲分析方法类似。
// 根据屏幕的高宽自定义坐标点 DisplayMetrics dm = getResources().getDisplayMetrics(); int width = dm.widthPixels; int height = dm.heightPixels; PointF point1 = new PointF(width * 1 / 10, height * 1 / 10); PointF point2 = new PointF(width * 4 / 10, height * 1f / 10); PointF point3 = new PointF(width * 5.5f / 10, height * 2.8f / 10); PointF point4 = new PointF(width * 3.5f / 10, height * 4.5f / 10); PointF point5 = new PointF(width * 2.0f / 10, height * 4.5f / 10); //创建多边形图形对象并进行绘制 GraphicPolygon graphicPolygon = new GraphicPolygon(); Dot dot1 = mapView.viewPointToMapPoint(point1); Dot dot2 = mapView.viewPointToMapPoint(point2); Dot dot3 = mapView.viewPointToMapPoint(point3); Dot dot4 = mapView.viewPointToMapPoint(point4); Dot dot5 = mapView.viewPointToMapPoint(point5); ArrayList<Dot> dots = new ArrayList<Dot>(); dots.add(dot1); dots.add(dot2); dots.add(dot3); dots.add(dot4); dots.add(dot5); dots.add(dot1); graphicPolygon.setPoints(dots); graphicPolygon.setColor(Color.argb(50, 0, 0, 255)); //图形绘制 mapView.getGraphicsOverlay().addGraphic(graphicPolygon); //把自定义多边形图形转化为几何对象 Geometry geometry = Graphic.toGeometry(graphicPolygon);
区缓冲分析的结果如下图所示: